package serialization

import (
	"bytes"
	"encoding/gob"
)

// gob 是 Go 语言标准库中的一种二进制序列化格式，适用于在 Go 程序之间传递数据
type Gob struct{}

func (s Gob) Marshal(object any) ([]byte, error) {
	var buffer bytes.Buffer            // 创建一个 bytes.Buffer 对象，用于存储编码后的字节数据
	encoder := gob.NewEncoder(&buffer) // 创建一个新的 gob.Encoder，并将其绑定到 buffer 上。编码器会将对象编码后的数据写入到这个缓冲区中
	err := encoder.Encode(object)      // 使用 encoder.Encode 方法将传入的 object 编码为 gob 格式，并写入到缓冲区 buffer 中。如果编码过程中出现错误，err 会包含相关的错误信息
	return buffer.Bytes(), err         // 返回结果
}

func (s Gob) Unmarshal(stream []byte, object any) error {
	buffer := bytes.NewBuffer(stream) // 创建一个新的 bytes.Buffer 对象，并将字节数组 stream 作为初始内容填充到缓冲区中
	decoder := gob.NewDecoder(buffer) // 创建一个新的 gob.Decoder，并将其绑定到 buffer 上。解码器会从这个缓冲区中读取数据并解码
	err := decoder.Decode(object)     // 使用 decoder.Decode 方法将缓冲区中的 gob 格式数据解码为 object。object 必须是一个指针，用于接收解码后的数据。如果解码过程中出现错误，err 会包含相关的错误信息
	return err                        // 返回解码过程中的错误信息，如果没有错误，返回 nil。
}
